home *** CD-ROM | disk | FTP | other *** search
/ The Essential Home & Business Collection / The Essential Home & Business Collection.iso / 27 / 3 / 5 / HP22D5.ZIP / EXTERN / FORMAT.C < prev    next >
Text File  |  1991-04-16  |  2KB  |  110 lines

  1. #include "extern.h"        /* Extensions need these! */
  2.  
  3. HANDLE pascal near reformat(ptr,width,height)
  4.  
  5. PTR ptr;
  6. int width,height;
  7.  
  8. {
  9.     PTR temp;
  10.     int len;
  11.     int slen;
  12.     int y = 0;
  13.     int i;
  14.     int nc;
  15.     HANDLE hdl;
  16.     int hlen;
  17.  
  18.     hdl = NewHandle(hlen = 1);
  19.     **hdl = '\0';
  20.  
  21.     slen = strlen(ptr);
  22.  
  23.     while (slen > 0) {
  24.  
  25. #pragma loop_opt(off)
  26.             for (temp = ptr,len = 0;
  27.              *temp && (*temp != '\r') && (len <= width);
  28.              temp++,len++);
  29.  
  30.         if (len <= width) len++;
  31.         else {
  32.             for (    temp = ptr + width,len = width;
  33.                 (len >= 0) && (*temp != ' ');
  34.                 len--,temp--    );
  35.             if (len < 0) len = width;
  36.             else while ((*temp == ' ') && *temp) temp++,len++;
  37.         }
  38. #pragma loop_opt(on)
  39.  
  40.         slen -= len;
  41.  
  42.         nc = len - 1;
  43.         while ((nc >= 0) && ((ptr[nc] == ' ') || (ptr[nc] == '\r'))) nc--;
  44.         nc++;
  45.  
  46.         ReAllocHandle(hdl,hlen + nc + 1);    // 1 for CR
  47.         strncpy(deref(hdl) + hlen - 1,ptr,nc);
  48.         deref(hdl)[hlen + nc - 1] = '\r';
  49.         deref(hdl)[hlen + nc] = '\0';
  50.         hlen += nc + 1;
  51.  
  52.         y++;
  53.         if (y >= height) break;
  54.         ptr += len;
  55.  
  56.     }
  57.  
  58.     if (hlen > 1) deref(hdl)[hlen - 2] = '\0';
  59.     return(hdl);
  60. }
  61.  
  62. /*
  63. ** This routine formats a block of text within a given width and height.
  64. ** It does this by inserting carriage returns into the text at positions
  65. ** where a line normally word wraps.
  66. **
  67. ** Parameters:
  68. **
  69. **    text        this is the text that you want formatted
  70. **    width        this is the width in which lines are broken
  71. **    height        this is the height in which to format text. If the
  72. **            height is too large, all of the text will be formatted.
  73. **
  74. ** To call this routine from HyperPAD:
  75. **
  76. **    put formatText(page field 1,10,9999) into page field 1;
  77. */
  78. format(int NumArgs,HANDLE hdl,HANDLE hWidth,HANDLE hHeight)
  79.  
  80. {
  81.     HANDLE newhdl;
  82.     int width,height;
  83.     PTR p;
  84.  
  85.     if (NumArgs != 3) return(ERROR);
  86.  
  87.     width = htoi(hWidth);
  88.     height = htoi(hHeight);
  89.  
  90.     p = LockHandle(hdl);
  91.  
  92.     newhdl = reformat(p,width,height);
  93.     ReturnValue(newhdl);
  94.  
  95.     UnLockHandle(hdl);
  96.  
  97.     return(STOP);
  98. }
  99.  
  100. POOL pascal Pool[] = {
  101.     {    "formatText",
  102.         format,
  103.         0,
  104.         FUNCTION},
  105.  
  106.     {    NULL,
  107.         NULL,
  108.         0,
  109.         0}    };
  110.